package normalArray;
public class productExceptSelf {
    // 法一：前缀和和后缀和
    // 乘积可以拆成左右两部分，然后做的时候老想着一次循环把左右都搞定，但其实是不行的
    // 对这个on的题目，数据肯定是要预处理的，且如果限制条件多，更是要预处理
    public static int[] productExceptSelf(int[] nums) {
        int[] prefix = new int[nums.length];
        int[] suffix = new int[nums.length];
        int[] arr = new int[nums.length];
        for(int i=0;i<nums.length;i++){
            if (i==0) {
                prefix[i]=1;
                continue;
            }
            prefix[i]=prefix[i-1]*nums[i-1];
        }
        for(int i=nums.length-1;i>=0;i--){
            if (i==nums.length-1) {
                suffix[i]=1;
                continue;
            }
            suffix[i]=suffix[i+1]*nums[i+1];
        }
        for (int i = 0; i < arr.length; i++) {
            arr[i]=prefix[i]*suffix[i];
        }
        return arr;
    }
    public static void main(String[] args) {
        // int[] nums = new int[]{1,2,3,4};
        int[] nums = new int[]{-1,1,0,-3,3};
        int[] productExceptSelf = productExceptSelf(nums);
        for (int i = 0; i < productExceptSelf.length; i++) {
            System.out.println(productExceptSelf[i]);
        }
    }
}
